// 基础版
export function performChunk(data, taskHandle) {
  // 参数归一化
  if (typeof data === 'number') {
    data = {
      length: data
    };
  }
  if (data.length === 0) {
    return;
  }
  let idx = 0;
  function _run() {
    if (idx > data.length - 1) {
      return;
    }
    // 一个渲染帧中，空闲时间 idle.timeRemaining() 执行分片任务
    requestIdleCallback(idle => {
      while (idle.timeRemaining() > 0 && idx < data.length) {
        taskHandle(data[idx], idx);
        idx++;
      }
      // 此次分片完成或者待渲染的边界条件到达
      // 继续等待下一个渲染帧
      _run();
    }, { timeout: 20 });
  }
  _run();
}

/**
 * 高阶函数
 * @param {*} data 要循环的数组
 * @param {*} taskHandle 循环数组需要执行什么任务，是一个函数
 * @param {*} scheduler 调度器 使用什么来执行任务(可以自己定义)
 * @returns undefined
 */
export function performChunkHigh(data, taskHandle, scheduler) {
  // 参数归一化
  if (typeof data === 'number') {
    data = {
      length: data
    };
  }
  if (data.length === 0) {
    return;
  }
  let i = 0;
  function _run() {
    if (i > data.length - 1) {
      return;
    }
    // 执行分片任务
    scheduler(goOn => {
      while (goOn() && i < data.length) {
        taskHandle(data[i], i);
        i++;
      }
      _run();
    });
  }
  _run();
}

// 浏览器默认使用(调度器默认使用requestIdleCallback)
export function browerPerformChunk(data, taskHandle) {
  const scheduler = task => {
    requestIdleCallback(idle => {
      task(() => idle.timeRemaining());
    });
  };
  performChunkHigh(data, taskHandle, scheduler);
}

export function browerPerformChunkOther(data, taskHandle) {
  const scheduler = task => {
    const start = Date.now();
    requestAnimationFrame(() => {
      task(() => Date.now() - start < 16.6);
    });
  };
  performChunkHigh(data, taskHandle, scheduler);
}